//#include <iostream>
//
//void Throw()
//{
//	throw "Func error";
//}
//
//void Func()
//{
//	int* Array = nullptr;
//	try
//	{
//		int* Array = new int[100];
//		Throw();
//	}
//	catch (...)
//	{
//		delete[] Array;
//		std::cout << "delete success!" << std::endl;
//		throw;
//	}
//	delete[] Array;
//	std::cout << "delete success!" << std::endl;
//}
//
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (const char* strerr)
//	{
//		std::cout << strerr << std::endl;
//	}
//	//运行结果：
//	//delete success!
//	//Func error
//	return 0;
//}

//#include <iostream>
//#include <stdexcept>
//
//void Func()
//{
//    char* arr1 = nullptr;
//    char* arr2 = nullptr;
//    char* arr3 = nullptr;
//    try {
//        arr1 = new char[10];
//    }
//    catch (const std::exception& e) {
//        std::cerr << "Exception during arr1 allocation: " << e.what() << std::endl;
//        throw;
//    }
//    try
//    {
//        arr2 = new char[10];
//    }
//    catch (const std::exception& e)
//    {
//        std::cerr << "Exception during arr2 allocation: " << e.what() << std::endl;
//        delete[] arr1;
//        throw;
//    }
//    try
//    {
//        arr3 = new char[10];
//    }
//    catch (const std::exception& e)
//    {
//        std::cerr << "Exception during arr3 allocation: " << e.what() << std::endl;
//        delete[] arr1;
//        delete[] arr2;
//        throw;
//    }
//
//
//    delete[] arr1;
//    delete[] arr2;
//    delete[] arr3;
//}
//int main() {
//        
//    try
//    {
//        Func();
//    }
//    catch (const std::exception& e)
//    {
//        std::cout <<"what：" << e.what() << std::endl;
//    }
//    return 0;
//}
//void Func()
//{
//	char* arr1 = new char[10];
//	char* arr2 = new char[10];
//	char* arr3 = new char[10];
//	delete[] arr1;
//	delete[] arr2;
//	delete[] arr3;
//}
//
//int main()
//{
//	Func();
//	return 0;
//}


//#include <iostream>
//template<class T>
//class SmartPtr
//{	
//public:
//	SmartPtr(T* ptr,bool IsArray = false)
//		:_ptr(ptr)
//		,_IsArray(IsArray)
//	{}
//	
//	~SmartPtr()
//	{
//		std::cout << "delete" << std::endl;
//		if (_IsArray)
//		{
//			delete[] _ptr;
//		}
//		else
//		{
//			delete _ptr;
//		}
//	}
//	//指针的行为
//	T& operator*()
//	{
//		return *_ptr;
//	}
//	T* operator->()
//	{
//		return _ptr;
//	}
//protected:
//	T* _ptr;
//	bool _IsArray;
//};
//
//void Func()
//{
//	//像指针一样解引用数据
//	SmartPtr<int> p1(new int(0));
//	*p1 += 10;
//
//	//像指针一样访问结构体成员
//	SmartPtr<std::pair<std::string, int>> p2(new std::pair<std::string, int>("",0));
//	p2->first = "sort";
//	p2->second = 2;
//}
//
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (const std::exception& e)
//	{
//		std::cout << "What : " << e.what() << std::endl;
//	}
//	//运行结果：
//	//delete
//	//delete
//	
//	return 0;
//}

//#include <iostream>
//#include <memory>
//int main()
//{
//	std::auto_ptr<int> p1(new int(100));
//	std::auto_ptr<int> p2(p1);
//	std::cout << "p1 : " << p1.get() << std::endl;
//	std::cout << "p2 : " << p2.get() << std::endl;
//	//运行结果
//	//p1 : 00000000
//	//p2: 00B7F868
//	return 0;
//}

//namespace yyf
//{
//	template<class T>
//	class unique_ptr
//	{
//	public:
//		unique_ptr()
//		
//	protected:
//		T* _ptr;
//	};
//};


//#include <iostream>
//#include <memory>
//int main()
//{
//	std::shared_ptr<int> p1(new int(10));
//	std::cout << p1.use_count() << std::endl;
//	std::shared_ptr<int> p2(p1);
//	std::cout << p1.use_count() << std::endl;
//	//运行结果：
//	//1
//	//2
//	return 0;
//}

//#include <iostream>
//
//namespace yyf
//{
//	template<class T>
//	class shared_ptr
//	{
//	public:
//		//构造时表示新的资源来了，为这个资源开辟一个引用计数
//		shared_ptr(T* ptr)
//			:_ptr(ptr)
//			, _ptr_count(new int(1))
//		{}
//
//		//拷贝构造时表示没有新的资源，只是浅拷贝，指向同一个资源和引用计数
//		shared_ptr(const shared_ptr& s)
//		{
//			_ptr = s._ptr;
//			_ptr_count = s._ptr_count;
//			(*_ptr_count)++;
//		}
//		//析构时，根据引用计数判断是否析构
//		~shared_ptr()
//		{
//			std::cout << _ptr << "count--" << std::endl;
//			if (--(*_ptr_count) == 0)
//			{
//				ClearCount();
//			}
//		}
//		void ClearCount()
//		{
//			std::cout << _ptr << "：delete" << std::endl;
//			delete _ptr;
//			delete _ptr_count;
//		}
//		shared_ptr<T>& operator = (const shared_ptr<T>&s)
//		{
//			if (s._ptr !=_ptr)
//			{
//				std::cout << _ptr << "count--" << std::endl;
//				if (-- * (_ptr_count) == 0)
//				{
//					ClearCount();
//				}
//				_ptr = s._ptr;
//				_ptr_count = s._ptr_count;
//				++(*_ptr_count);
//			}
//			return *this;
//		}
//		int use_count()
//		{
//			return *_ptr_count;
//		}
//	protected:
//		T* _ptr;
//		int* _ptr_count;
//	};
//};
//
//
//int main()
//{
//	yyf::shared_ptr<int> p1(new int(100));
//	std::cout << "p1 count：" << p1.use_count() << std::endl;
//	yyf::shared_ptr<int> p2(p1);
//	std::cout << "p1 and p2 of count：" << p1.use_count() << std::endl;
//	yyf::shared_ptr<int> p3(new int(1));
//	std::cout << "p3 count：" << p3.use_count() << std::endl;
//	p3 = p1;
//	std::cout << "p1 and p2 and p3 count：" << p3.use_count() << std::endl;
//	return 0;
//}


//#include <iostream>
//#include <memory>
//namespace yyf
//{
//template<class T>
//class weak_ptr
//{
//public:
//	weak_ptr() :_ptr(nullptr)
//	{}
//	weak_ptr(const std::shared_ptr<T>& s)
//	{
//		_ptr = s.get();
//	}
//	weak_ptr<T>& operator=(const std::shared_ptr<T>& s)
//	{
//		_ptr = s.get();
//		return *this;
//	}
//	T& operator*()
//	{
//		return *_ptr;
//	}
//	T* operator->()
//	{
//		return _ptr;
//	}
//protected:
//	T* _ptr;
//};
//}
//struct ListNode 
//{
//	int _val;
//	std::weak_ptr<ListNode> _next;
//	std::weak_ptr<ListNode> _prev;
//
//	ListNode(int val = 0) :_val(val)
//	{}
//
//	~ListNode()
//	{
//		std::cout << "delete" << std::endl;
//	}
//};
//
//int main()
//{
//	std::shared_ptr<ListNode> p1(new ListNode);
//	std::shared_ptr<ListNode> p2(new ListNode);
//	p1->_next = p2;
//	p2->_prev = p1;
//	//运行结果：
//	//delete
//	//delete
//	return 0;
//}
//#include <iostream>
//#include <memory>
//#include <functional>


//namespace yyf
//{
//	template<class T>
//	class shared_ptr
//	{
//	public:
//		//定制删除器版的构造
//		template<class D>
//		shared_ptr(T* ptr, D del)
//			:_ptr(ptr)
//			, _ptr_count(new int(1))
//			, _del(del)
//		{}
//		shared_ptr(T* ptr)
//			:_ptr(ptr)
//			, _ptr_count(new int(1))
//		{}
//
//		shared_ptr(const shared_ptr& s)
//		{
//			_ptr = s._ptr;
//			_ptr_count = s._ptr_count;
//			_del = s._del;
//			(*_ptr_count)++;
//		}
//		~shared_ptr()
//		{
//			std::cout << _ptr << "count--" << std::endl;
//			if (--(*_ptr_count) == 0)
//			{
//				ClearCount();
//			}
//		}
//		void ClearCount()
//		{
//			_del(_ptr);
//			delete _ptr_count;
//		}
//		shared_ptr<T>& operator = (const shared_ptr<T>& s)
//		{
//			if (s._ptr != _ptr)
//			{
//				if (-- * (_ptr_count) == 0)
//				{
//					ClearCount();
//				}
//				_ptr = s._ptr;
//				_ptr_count = s._ptr_count;
//				_del = s._del;
//				++(*_ptr_count);
//			}
//			return *this;
//		}
//		int use_count()
//		{
//			return *_ptr_count;
//		}
//	protected:
//		T* _ptr;
//		int* _ptr_count;
//		std::function<void(T*)> _del = [](T* ptr) {
//			delete ptr;
//		};
//	};
//};
//
//template<class T>
//struct DelArray
//{
//	void operator()(T* p)
//	{
//		delete[] p;
//	}
//};
//struct ListNode 
//{
//	int _val;
//	std::weak_ptr<ListNode> _next;
//	std::weak_ptr<ListNode> _prev;
//
//	ListNode(int val = 0) :_val(val)
//	{}
//
//	~ListNode()
//	{
//		std::cout << "delete" << std::endl;
//	}
//};
//int main()
//{
//	yyf::shared_ptr<ListNode> ptr1(new ListNode[5], DelArray<ListNode>());//传入可调用对象
//	std::cout << "ptr2：" << std::endl;
//	yyf::shared_ptr<ListNode> ptr2(new ListNode(10));
//	return 0;
//}






